package com.future.mvc.web.datavalid.entity;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;
import java.util.Map;

/**
 * <P>
 *
 * </p>
 *
 * @author yinhao
 * @version 1.0
 * @since 2024/9/6 22:14
 */
@Controller
@Scope("prototype")
public class MonsterHandler {

    @RequestMapping("/addMonsterUI")
    public String addMonsterUI(Map<String,Object> map){
        map.put("monster",new Monster());
        return "datavalid/monster_addUI";
    }

    // 什么时候进行校验?
    // 在springmvc底层,反射调用方法时,会接收到http请求的数据,然后根据注解进行验证
    // 在验证中如果出现了错误,就把错误信息填充errors和map
    @RequestMapping("/save")
    public String save(@Valid Monster monster, Errors errors, Map<String,Object> map){
        System.out.println(monster);
        System.out.println("=========map=========");
        map.entrySet().forEach(System.out::println);
        System.out.println("========errors=======");
        if (errors.hasErrors()) {
            for (ObjectError error : errors.getAllErrors()) {
                System.out.println(error);
            }
            return "datavalid/monster_addUI";
        }
        return "datavalid/success";
    }

    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        // 当表单提交字段为name时,不再把接收到的值填充到model数据monster的name属性
        // 机制: springmvc在底层通过反射调用`目标方法时,接收到http请求的参数和值,使用反射+注解技术,取消对指定属性的填充
        // setDisallowedFields支持可变参数,可以指定多个字段
        // 如果取消某个属性绑定,验证就没有意义了,应当吧验证的注解去掉, name属性会使用默认值
        // webDataBinder.setDisallowedFields("name");
    }
}
